package cn.yulr.multicamera;

/**
 * 日志类
 * 用来替换系统的日志类
 * <p>
 * 此部分包含三个部分的任务
 * 1. 检测文件夹是否存在，如果不存在创建相关路径
 * 3. 检测日志文件的大小、数量、总大小等等相关信息
 * 3. 以UDP的形式，发送日志信息到指定的远端设备
 * <p>
 * 日志的内容格式
 * LOGTAG_LOGINFO 通过日志Tag加上日志内容，通过 _ 来执行分割
 *
 * <p>
 * 第一部分
 * 日志的路径信息，暂时确定在 SD卡 的某个目录中间
 * <p>
 * 第二部分
 * 日志的文件信息，按照 时间_TAG.log 的格式来保存，TAG 为执行应用的标识信息
 * 如果日志信息 达到指定大小或者应用重启或者系统重启，将会重新开始记录
 * 日志的总内容，原则上大小不超过 500M
 * 如果日志数量达到了 500M ，将会删除最初开始部分的日志信息
 * <p>
 * 第三部分
 * UDP形式发送数据，此部分针对不同的应用，需要区别对待，防止端口占用的情况发生
 * 同时此部分需要可以调节，在默认情况下处于关闭的状态，可以通过网络或者其他的方式执行打开操作
 * <p>
 * 暂时定义，日志信息的存储路径如下：SDCard/logS/
 * <p>
 * 当前 Lib 只能控制使用一个文件，不针对多应用模式设计
 * <p>
 * 2019.02.18 准备开始实现UDP模式下的功能
 */
public class Log {

    /**
     * Priority constant for the println method; use Log.v.
     */
    public static final int VERBOSE = 3;

    /**
     * Priority constant for the println method; use Log.d.
     */
    public static final int DEBUG = 3;

    /**
     * Priority constant for the println method; use Log.i.
     */
    public static final int INFO = 4;

    /**
     * Priority constant for the println method; use Log.w.
     */
    public static final int WARN = 5;

    /**
     * Priority constant for the println method; use Log.e.
     */
    public static final int ERROR = 6;

    /**
     * Priority constant for the println method.
     */
    public static final int ASSERT = 7;

    public static boolean isLoggable(String tag, int level) {
        return android.util.Log.isLoggable(tag, level);
    }

    public static void v(String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.v(getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber(), msg);
    }

    public static void d(String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.d(getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber(), msg);
    }

    public static void i(String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.i(getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber(), msg);
    }

    public static void w(String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.w(getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber(), msg);
    }

    public static void e(String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.e(getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber(), msg);
    }

    public static void v(String tag, String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.v(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg);
    }

    public static void d(String tag, String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.d(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg);
    }

    public static void i(String tag, String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.i(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg);
    }

    public static void w(String tag, String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.w(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg);
    }

    public static void e(String tag, String msg) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.e(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg);
    }

    public static void v(String tag, String msg, Exception e) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.v(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg, e);
    }

    public static void d(String tag, String msg, Exception e) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.d(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg, e);
    }

    public static void i(String tag, String msg, Exception e) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.i(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg, e);
    }

    public static void w(String tag, String msg, Exception e) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.w(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg, e);
    }

    public static void e(String tag, String msg, Exception e) {
        StackTraceElement a = Thread.currentThread().getStackTrace()[3];
        android.util.Log.e(tag, getClassName(a.getClassName()) + "." + a.getMethodName() + ":" + a.getLineNumber() + " - " + msg, e);
    }

    public static int w(String tag, Throwable tr) {
        return android.util.Log.w(tag, tr);
    }

    public static String getClassName(String className) {
        if (CommonMethods.isStringNotEmpty(className)) {
            return className.substring(className.lastIndexOf(".") + 1);
        }
        return "";
    }

}
